gpx writer, garminextensions option: fix bug with magic values causing extension...
authortsteven4 <tsteven4@f51c46e8-681c-474f-0cfe-069cfd0219fb>
Sat, 16 Mar 2013 14:38:06 +0000 (14:38 +0000)
committertsteven4 <tsteven4@f51c46e8-681c-474f-0cfe-069cfd0219fb>
Sat, 16 Mar 2013 14:38:06 +0000 (14:38 +0000)
git-svn-id: http://gpsbabel.googlecode.com/svn/trunk@4352 f51c46e8-681c-474f-0cfe-069cfd0219fb

gpsbabel/gpx.cc
gpsbabel/reference/extensiondata.unicsv [new file with mode: 0644]
gpsbabel/reference/extensiondata~unicsv.gpx [new file with mode: 0644]
gpsbabel/testo.d/gpx.test

index 1c11c8259048cc63629bf317b0715de8e2a98234..5d27c0ecab3e83a45ee779461422b5cc7cb2609c 100644 (file)
@@ -1657,16 +1657,16 @@ static void
 gpx_write_common_extensions(const waypoint* waypointp, const gpx_point_type point_type)
 {
   // gpx version we are writing is >= 1.1.
-  if ((opt_humminbirdext && (waypointp->depth != 0 || waypointp->temperature != 0)) ||
-      (opt_garminext && gpxpt_waypoint==point_type && (waypointp->temperature != 0 || waypointp->depth != 0)) ||
-      (opt_garminext && gpxpt_track==point_type && (waypointp->temperature != 0 || waypointp->depth != 0 || waypointp->heartrate != 0 || waypointp->cadence != 0))) {
+  if ((opt_humminbirdext && (WAYPT_HAS(waypointp, depth) || WAYPT_HAS(waypointp, temperature))) ||
+      (opt_garminext && gpxpt_waypoint==point_type && (WAYPT_HAS(waypointp, temperature) || WAYPT_HAS(waypointp, depth))) ||
+      (opt_garminext && gpxpt_track==point_type && (WAYPT_HAS(waypointp, temperature) || WAYPT_HAS(waypointp, depth) || waypointp->heartrate != 0 || waypointp->cadence != 0))) {
     writer.writeStartElement("extensions");
 
     if (opt_humminbirdext) {
-      if (waypointp->depth != 0) {
+      if (WAYPT_HAS(waypointp, depth)) {
         writer.writeTextElement("h:depth", toString(waypointp->depth * 100.0));
       }
-      if (waypointp->temperature != 0) {
+      if (WAYPT_HAS(waypointp, temperature)) {
         writer.writeTextElement("h:temperature", toString(waypointp->temperature));
       }
     }
@@ -1678,12 +1678,12 @@ gpx_write_common_extensions(const waypoint* waypointp, const gpx_point_type poin
       // Although not required by the schema we assume that gpxtpx:TrackPointExtension must be a child of gpx:trkpt.
       switch (point_type) {
       case gpxpt_waypoint:
-        if (waypointp->temperature != 0 || waypointp->depth != 0) {
+        if (WAYPT_HAS(waypointp, temperature) || WAYPT_HAS(waypointp, depth)) {
           writer.writeStartElement("gpxx:WaypointExtension");
-          if (waypointp->temperature != 0) {
+          if (WAYPT_HAS(waypointp, temperature)) {
             writer.writeTextElement("gpxx:Temperature", toString(waypointp->temperature));
           }
-          if (waypointp->depth != 0) {
+          if (WAYPT_HAS(waypointp, depth)) {
             writer.writeTextElement("gpxx:Depth", toString(waypointp->depth));
           }
           writer.writeEndElement(); // "gpxx:WaypointExtension"
@@ -1693,13 +1693,13 @@ gpx_write_common_extensions(const waypoint* waypointp, const gpx_point_type poin
         /* we don't have any appropriate data for the children of gpxx:RoutePointExtension */
         break;
       case gpxpt_track:
-        if (waypointp->temperature != 0 || waypointp->depth != 0 || waypointp->heartrate != 0 || waypointp->cadence != 0) {
+        if (WAYPT_HAS(waypointp, temperature) || WAYPT_HAS(waypointp, depth) || waypointp->heartrate != 0 || waypointp->cadence != 0) {
           // gpxtpx:TrackPointExtension is a replacement for gpxx:TrackPointExtension.
           writer.writeStartElement("gpxtpx:TrackPointExtension");
-          if (waypointp->temperature != 0) {
+          if (WAYPT_HAS(waypointp, temperature)) {
             writer.writeTextElement("gpxtpx:atemp", toString(waypointp->temperature));
           }
-          if (waypointp->depth != 0) {
+          if (WAYPT_HAS(waypointp, depth)) {
             writer.writeTextElement("gpxtpx:depth", toString(waypointp->depth));
           }
           if (waypointp->heartrate != 0) {
diff --git a/gpsbabel/reference/extensiondata.unicsv b/gpsbabel/reference/extensiondata.unicsv
new file mode 100644 (file)
index 0000000..aa2241e
--- /dev/null
@@ -0,0 +1,6 @@
+name,                          lat,        lon,   ele,depth,temp,heart,caden
+Lickskillet,             40.075297, -105.414373, 2294,     ,  20,   60, 85
+Gold Hill,               40.063311, -105.409614, 2514,     ,  18,  160, 45
+Barker Reservoir Dam,    39.966120, -105.482821, 2499,   37,    ,   50,
+Barker Reservoir Shore,  39.962905, -105.502236, 2499,    0,    ,   40,
+James Peak,              39.852048, -105.690364, 4063,     ,   0,   70,
diff --git a/gpsbabel/reference/extensiondata~unicsv.gpx b/gpsbabel/reference/extensiondata~unicsv.gpx
new file mode 100644 (file)
index 0000000..806b170
--- /dev/null
@@ -0,0 +1,128 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<gpx version="1.1" creator="GPSBabel - http://www.gpsbabel.org" xmlns="http://www.topografix.com/GPX/1/1" xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3" xmlns:gpxtpx="http://www.garmin.com/xmlschemas/TrackPointExtension/v1">
+  <metadata>
+    <time>1970-01-01T00:00:00Z</time>
+    <bounds minlat="39.852048000" minlon="-105.690364000" maxlat="40.075297000" maxlon="-105.409614000"/>
+  </metadata>
+  <wpt lat="40.075297000" lon="-105.414373000">
+    <ele>2294.000000</ele>
+    <name>Lickskillet</name>
+    <cmt>Lickskillet</cmt>
+    <desc>Lickskillet</desc>
+    <extensions>
+      <gpxx:WaypointExtension>
+        <gpxx:Temperature>20.000000</gpxx:Temperature>
+      </gpxx:WaypointExtension>
+    </extensions>
+  </wpt>
+  <wpt lat="40.063311000" lon="-105.409614000">
+    <ele>2514.000000</ele>
+    <name>Gold Hill</name>
+    <cmt>Gold Hill</cmt>
+    <desc>Gold Hill</desc>
+    <extensions>
+      <gpxx:WaypointExtension>
+        <gpxx:Temperature>18.000000</gpxx:Temperature>
+      </gpxx:WaypointExtension>
+    </extensions>
+  </wpt>
+  <wpt lat="39.966120000" lon="-105.482821000">
+    <ele>2499.000000</ele>
+    <name>Barker Reservoir Dam</name>
+    <cmt>Barker Reservoir Dam</cmt>
+    <desc>Barker Reservoir Dam</desc>
+    <extensions>
+      <gpxx:WaypointExtension>
+        <gpxx:Depth>37.000000000</gpxx:Depth>
+      </gpxx:WaypointExtension>
+    </extensions>
+  </wpt>
+  <wpt lat="39.962905000" lon="-105.502236000">
+    <ele>2499.000000</ele>
+    <name>Barker Reservoir Shore</name>
+    <cmt>Barker Reservoir Shore</cmt>
+    <desc>Barker Reservoir Shore</desc>
+    <extensions>
+      <gpxx:WaypointExtension>
+        <gpxx:Depth>0.000000000</gpxx:Depth>
+      </gpxx:WaypointExtension>
+    </extensions>
+  </wpt>
+  <wpt lat="39.852048000" lon="-105.690364000">
+    <ele>4063.000000</ele>
+    <name>James Peak</name>
+    <cmt>James Peak</cmt>
+    <desc>James Peak</desc>
+    <extensions>
+      <gpxx:WaypointExtension>
+        <gpxx:Temperature>0.000000</gpxx:Temperature>
+      </gpxx:WaypointExtension>
+    </extensions>
+  </wpt>
+  <trk>
+    <trkseg>
+      <trkpt lat="40.075297000" lon="-105.414373000">
+        <ele>2294.000000</ele>
+        <name>Lickskillet</name>
+        <cmt>Lickskillet</cmt>
+        <desc>Lickskillet</desc>
+        <extensions>
+          <gpxtpx:TrackPointExtension>
+            <gpxtpx:atemp>20.000000</gpxtpx:atemp>
+            <gpxtpx:hr>60</gpxtpx:hr>
+            <gpxtpx:cad>85</gpxtpx:cad>
+          </gpxtpx:TrackPointExtension>
+        </extensions>
+      </trkpt>
+      <trkpt lat="40.063311000" lon="-105.409614000">
+        <ele>2514.000000</ele>
+        <name>Gold Hill</name>
+        <cmt>Gold Hill</cmt>
+        <desc>Gold Hill</desc>
+        <extensions>
+          <gpxtpx:TrackPointExtension>
+            <gpxtpx:atemp>18.000000</gpxtpx:atemp>
+            <gpxtpx:hr>160</gpxtpx:hr>
+            <gpxtpx:cad>45</gpxtpx:cad>
+          </gpxtpx:TrackPointExtension>
+        </extensions>
+      </trkpt>
+      <trkpt lat="39.966120000" lon="-105.482821000">
+        <ele>2499.000000</ele>
+        <name>Barker Reservoir Dam</name>
+        <cmt>Barker Reservoir Dam</cmt>
+        <desc>Barker Reservoir Dam</desc>
+        <extensions>
+          <gpxtpx:TrackPointExtension>
+            <gpxtpx:depth>37.000000000</gpxtpx:depth>
+            <gpxtpx:hr>50</gpxtpx:hr>
+          </gpxtpx:TrackPointExtension>
+        </extensions>
+      </trkpt>
+      <trkpt lat="39.962905000" lon="-105.502236000">
+        <ele>2499.000000</ele>
+        <name>Barker Reservoir Shore</name>
+        <cmt>Barker Reservoir Shore</cmt>
+        <desc>Barker Reservoir Shore</desc>
+        <extensions>
+          <gpxtpx:TrackPointExtension>
+            <gpxtpx:depth>0.000000000</gpxtpx:depth>
+            <gpxtpx:hr>40</gpxtpx:hr>
+          </gpxtpx:TrackPointExtension>
+        </extensions>
+      </trkpt>
+      <trkpt lat="39.852048000" lon="-105.690364000">
+        <ele>4063.000000</ele>
+        <name>James Peak</name>
+        <cmt>James Peak</cmt>
+        <desc>James Peak</desc>
+        <extensions>
+          <gpxtpx:TrackPointExtension>
+            <gpxtpx:atemp>0.000000</gpxtpx:atemp>
+            <gpxtpx:hr>70</gpxtpx:hr>
+          </gpxtpx:TrackPointExtension>
+        </extensions>
+      </trkpt>
+    </trkseg>
+  </trk>
+</gpx>
index 60b35c7ab0ff8dd177b6b3300208a6d3e7f528ca..6f22716856f1c958c112568643e3dccd4b18cc10 100644 (file)
@@ -17,3 +17,6 @@ rm -f ${TMPDIR}/basecampe~gpx.gpx
 gpsbabel -i gpx -f ${REFERENCE}/basecamp.gpx -o gpx -F ${TMPDIR}/basecamp~gpx.gpx
 compare ${REFERENCE}/basecamp~gpx.gpx ${TMPDIR}/basecamp~gpx.gpx 
 
+rm -f ${TMPDIR}/extensiondata.gpx
+gpsbabel -i unicsv -f ${REFERENCE}/extensiondata.unicsv -x transform,trk=wpt -o gpx,garminextensions -F ${TMPDIR}/extensiondata.gpx
+compare ${REFERENCE}/extensiondata~unicsv.gpx ${TMPDIR}/extensiondata.gpx